package com.order.frontend.order.controller.ChaController;

import com.order.frontend.order.utils.cs.Other.WebSocketSessionManager;
import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import java.util.concurrent.TimeUnit;

@ServerEndpoint("/websocket/{userId}")
@Component
public class ChatWebSocketHandler {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    private static WebSocketSessionManager sessionManager = new WebSocketSessionManager();

    @OnOpen
    public void onOpen(@PathParam("userId") String userId, Session session) {
        // 当客户端成功建立WebSocket连接时执行
        // 通常用于：
        // - 用户登录状态记录
        // - 将用户加入在线列表
        // - 发送欢迎消息
        // - 初始化用户会话数据
        sessionManager.addUser(userId, (WebSocketSession) session);
        System.out.println("用户 " + userId + " 已连接");
        // 更新Redis状态（用于集群和持久化）
        redisTemplate.opsForValue().set("user:online:" + userId, "1", 30, TimeUnit.MINUTES);
    }

    @OnClose
    public void onClose(@PathParam("userId") String userId, Session session) {
        // 当WebSocket连接正常关闭时执行
        // 通常用于：
        // - 从在线用户列表中移除用户
        // - 清理会话数据
        // - 通知其他用户该用户已下线
        sessionManager.removeUser(userId);
        // 更新Redis状态
        redisTemplate.delete("user:online:" + userId);
        System.out.println("用户 " + userId + " 已断开连接");
    }

    @OnError
    public void onError(@PathParam("userId") String userId, Session session, Throwable throwable) {
        // 当WebSocket通信过程中发生错误时执行
        // 通常用于：
        // - 记录错误日志
        // - 清理异常连接
        // - 通知管理员
        sessionManager.removeUser(userId);
        redisTemplate.delete("user:online:" + userId);
        System.out.println("用户 " + userId + " 连接异常");
    }
}

